package com.hhxy.rabbitmq.demo08;

import com.hhxy.rabbitmq.utils.RabbitMqUtil;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.impl.AMQBasicProperties;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ghp
 * @date 2023/2/25
 * @title
 * @description
 */
public class Producer {

    // 普通交换机
    public static final String NORMAL_EXCHANGE = "normal_exchange";
    // 死信交换机
    public static final String DEAD_EXCHANGE = "dead_exchange";
    // 普通队列
    public static final String NORMAL_QUEUE = "normal_queue";
    // 死信队列
    public static final String DEAD_QUEUE = "dead_queue";

    public static void main(String[] args) throws Exception {
        // 1、获取信道
        Channel channel = RabbitMqUtil.getChannel();

        // 2、声明交换机
        channel.exchangeDeclare(NORMAL_EXCHANGE, BuiltinExchangeType.DIRECT);
        channel.exchangeDeclare(DEAD_EXCHANGE, BuiltinExchangeType.DIRECT);

        // 3、声明队列
        // 配置其它参数，用于将普通队列绑定一个死信交换机，这样就能够将普通队列中的死信转发到死信队列中
        Map<String, Object> arguments = new HashMap<>();
        // 过期时间10s，普通消息过了10s，还未被消费就变成了死信（可以直接有生产者指定）
//        arguments.put("x-dead-letter-exchange", 10000);
        // 为正常队列设置死信交换机，用于将普通队列中的死信转发到死信队列中（固定写法）
        arguments.put("x-dead-letter-exchange", DEAD_EXCHANGE);
        // 设置死信交换机的RoutingKey
        arguments.put("x-dead-letter-routing-key", "dead");
        // 声明一个普通队列
        channel.queueDeclare(NORMAL_QUEUE,false, false, false, arguments);
        // 声明一个死信队列
        channel.queueDeclare(DEAD_QUEUE,false, false, false, null);

        // 4、绑定交换机和队列
        // 绑定普通对列和普通交换机
        channel.queueBind(NORMAL_QUEUE, NORMAL_EXCHANGE, "normal");
        // 绑定死信队列和死信交换机
        channel.queueBind(DEAD_QUEUE, DEAD_EXCHANGE, "dead");


        // 5、发送消息
        // 设置消息的过期时间10s，如果普通消息经过10s还没有被消息就会添加到死信队列中
        AMQP.BasicProperties  properties =
                new AMQP.BasicProperties()
                        .builder().expiration("10000").build();
        for (int i = 0; i < 10; i++) {
            String message = "消息" + i;
            channel.basicPublish(NORMAL_EXCHANGE, "normal", properties, message.getBytes());
        }
        System.out.println("消息发送完毕!");
    }
}
